home *** CD-ROM | disk | FTP | other *** search
/ Aminet 15 / Aminet 15 - Nov 1996.iso / Aminet / dev / c / EasygadgetsSou.lha / EasyGadgets / Gadgets.c < prev    next >
C/C++ Source or Header  |  1995-11-09  |  20KB  |  684 lines

  1. /*
  2.  *    File:                    Gadgets.c
  3.  *    Description:    
  4.  *
  5.  *    (C) 1994,1995 Ketil Hunn
  6.  *
  7.  */
  8.  
  9. #ifndef EG_GADGETS_H
  10. #define EG_GADGETS_H
  11.  
  12. /*** INCLUDES ************************************************************************/
  13. #ifndef INTUITION_GADGETCLASS_H
  14. #include <intuition/gadgetclass.h>
  15. #endif
  16.  
  17. /*** GLOBALS *************************************************************************/
  18. __chip static UWORD EG_GetDirImageData[]=
  19. {
  20.     0x03c0,    /* ......****...... */
  21.     0x0420,    /* .....*....*..... */
  22.     0xf810,    /* *****......*.... */
  23.     0xfc10,    /* ******.....*.... */
  24.     0xc3f0,    /* **....******.... */
  25.     0xc010,    /* **.........*.... */
  26.     0xc010,    /* **.........*.... */
  27.     0xc010,    /* **.........*.... */
  28.     0xc010,    /* **.........*.... */
  29.     0xfff0,    /* ************.... */
  30. };
  31.  
  32. __chip static UWORD EG_GetFileImageData[]=
  33. {
  34.     0xfc00,    /* ******.......... */
  35.     0xca00,    /* **..*.*......... */
  36.     0xc900,    /* **..*..*........ */
  37.     0xc980,    /* **..*..**....... */
  38.     0xcf80,    /* **..*****....... */
  39.     0xc180,    /* **.....**....... */
  40.     0xc180,    /* **.....**....... */
  41.     0xc180,    /* **.....**....... */
  42.     0xc180,    /* **.....**....... */
  43.     0xff80,    /* *********....... */
  44. };
  45.  
  46. __chip static UWORD EG_PopUpImageData[]=
  47. {
  48.     0x3800,    /* ..***........... */
  49.     0x3800,    /* ..***........... */
  50.     0x3800,    /* ..***........... */
  51.     0xfe00,    /* *******......... */
  52.     0x7c00,    /* .*****.......... */
  53.     0x3800,    /* ..***........... */
  54.     0x1000,    /* ...*............ */
  55.     0x0000,    /* ................ */
  56.     0xfe00,    /* *******......... */
  57. };
  58.  
  59. /*** FUNCTIONS ***********************************************************************/
  60. /*
  61. __asm void egCalcGadgetImage(    register __a0 struct egImageExt    *eggad,
  62.                                                             register __a1 struct DrawInfo        *dri,
  63.                                                             register __a2 struct NewGadget    *ng,
  64.                                                             register __a3 UWORD                            *imagedata,
  65.                                                             register __d0 ULONG                            imagewidth,
  66.                                                             register __d1 ULONG                            imageheight,
  67.                                                             register __d2    BYTE                            imagedepth)
  68. {
  69.     UBYTE *data;
  70.     struct RastPort    rp;
  71.     ULONG    depth=dri->dri_Depth;
  72.     ULONG    imagesize=(ng->ng_Width+15)/16*4*ng->ng_Height*depth;
  73.  
  74. #ifdef MYDEBUG_H
  75.     DebugOut("egCalcGadgetImage");
  76. #endif
  77.  
  78.     eggad->ImageBitMap.BytesPerRow    =2;
  79.     eggad->ImageBitMap.Flags                =0;
  80.     eggad->ImageBitMap.Depth                =imagedepth;
  81.     eggad->ImageBitMap.pad                    =0;
  82.     eggad->ImageBitMap.Rows                    =imageheight;
  83.  
  84.     eggad->ImageBitMap.Planes[0]        =
  85.     eggad->ImageBitMap.Planes[1]        =
  86.     eggad->ImageBitMap.Planes[2]        =
  87.     eggad->ImageBitMap.Planes[3]        =
  88.     eggad->ImageBitMap.Planes[4]        =
  89.     eggad->ImageBitMap.Planes[5]        =
  90.     eggad->ImageBitMap.Planes[6]        =
  91.     eggad->ImageBitMap.Planes[7]        =(PLANEPTR)imagedata;
  92.  
  93.     if(data=AllocVec(imagesize, MEMF_CLEAR|MEMF_CHIP|MEMF_PUBLIC))
  94.     {
  95.         ULONG planemask=(1L<<depth)-1;
  96.         ULONG y=(ng->ng_Height-imageheight)/2,
  97.                     x=(ng->ng_Width-imagewidth)/2;
  98.         register int i;
  99.         register UBYTE *bitplane;
  100.         register ULONG off=imagesize/depth/2;
  101.  
  102.         eggad->Image1.LeftEdge        =0;
  103.         eggad->Image1.TopEdge            =0;
  104.         eggad->Image1.Width                =ng->ng_Width;
  105.         eggad->Image1.Height            =ng->ng_Height;
  106.         eggad->Image1.Depth                =imagedepth;
  107.         eggad->Image1.PlanePick        =planemask;
  108.         eggad->Image1.PlaneOnOff    =0;
  109.         eggad->Image1.NextImage        =NULL;
  110.         eggad->Image1.ImageData        =(UWORD *)data;
  111.         eggad->Image2                            =eggad->Image1;
  112.         eggad->Image2.ImageData        =(UWORD *)(data+imagesize/2);
  113.  
  114.         InitBitMap(&eggad->BitMap, depth, ng->ng_Width, ng->ng_Height);
  115.         InitRastPort(&rp);
  116.         rp.BitMap=&eggad->BitMap;
  117.  
  118.         for(bitplane=(PLANEPTR)eggad->Image1.ImageData, i=0; i<depth; i++, bitplane+=off)
  119.             eggad->BitMap.Planes[i]=bitplane;
  120.  
  121.         SetRast(&rp, dri->dri_Pens[BACKGROUNDPEN]);
  122.         DrawBevelBox(&rp,
  123.                                     0, 0, ng->ng_Width, ng->ng_Height,
  124.                                     GT_VisualInfo, ng->ng_VisualInfo,
  125.                                     TAG_DONE);
  126. //        BltBitMap(&eggad->ImageBitMap, 0, 0, &eggad->BitMap, x, y, imagewidth, imageheight, ABC|ABNC|ANBC, dri->dri_Pens[TEXTPEN],NULL);
  127.         BltBitMap(&eggad->ImageBitMap, 0, 0, &eggad->BitMap, x, y, imagewidth, imageheight, 0xff, dri->dri_Pens[TEXTPEN],NULL);
  128.  
  129.  
  130.         for(bitplane=(PLANEPTR)eggad->Image2.ImageData, i=0; i<depth; i++, bitplane+=off)
  131.             eggad->BitMap.Planes[i]=bitplane;
  132.  
  133.         SetRast(&rp, dri->dri_Pens[FILLPEN]);
  134.         DrawBevelBox(&rp, 0, 0, ng->ng_Width, ng->ng_Height,
  135.                                     GT_VisualInfo,    ng->ng_VisualInfo,
  136.                                     GTBB_Recessed,    FALSE,
  137.                                     TAG_DONE);
  138.         BltBitMap(&eggad->ImageBitMap, 0,0, &eggad->BitMap, x, y, imagewidth, imageheight, ANBC, planemask, NULL);
  139.         BltBitMap(&eggad->ImageBitMap, 0,0, &eggad->BitMap, x, y, imagewidth, imageheight, ABC|ABNC|ANBC,    dri->dri_Pens[FILLTEXTPEN], NULL);
  140.     }
  141. }
  142. */
  143.  
  144. __asm void egCalcGadgetImage(    register __a0 struct egImageExt    *eggad,
  145.                                                             register __a1 struct DrawInfo        *dri,
  146.                                                             register __a2 struct NewGadget    *ng,
  147.                                                             register __a3 UWORD                            *imagedata,
  148.                                                             register __d0 ULONG                            imagewidth,
  149.                                                             register __d1 ULONG                            imageheight,
  150.                                                             register __d2    BYTE                            imagedepth)
  151. {
  152.     UBYTE *data;
  153.     struct RastPort    rp;
  154.     ULONG    depth=dri->dri_Depth;
  155.     ULONG    imagesize=(ng->ng_Width+15)/16*4*ng->ng_Height*depth;
  156.  
  157. #ifdef MYDEBUG_H
  158.     DebugOut("egCalcGadgetImage");
  159. #endif
  160.  
  161.     eggad->ImageBitMap.BytesPerRow    =2;
  162.     eggad->ImageBitMap.Flags                =0;
  163.     eggad->ImageBitMap.Depth                =imagedepth;
  164.     eggad->ImageBitMap.pad                    =0;
  165.     eggad->ImageBitMap.Rows                    =imageheight;
  166.  
  167.     eggad->ImageBitMap.Planes[0]        =
  168.     eggad->ImageBitMap.Planes[1]        =
  169.     eggad->ImageBitMap.Planes[2]        =
  170.     eggad->ImageBitMap.Planes[3]        =
  171.     eggad->ImageBitMap.Planes[4]        =
  172.     eggad->ImageBitMap.Planes[5]        =
  173.     eggad->ImageBitMap.Planes[6]        =
  174.     eggad->ImageBitMap.Planes[7]        =(PLANEPTR)imagedata;
  175.  
  176.     if(data=AllocVec(imagesize, MEMF_CLEAR|MEMF_CHIP|MEMF_PUBLIC))
  177.     {
  178.         ULONG planemask=(1L<<depth)-1;
  179.         ULONG y=(ng->ng_Height-imageheight)/2,
  180.                     x=(ng->ng_Width-imagewidth)/2;
  181.  
  182.         eggad->Image1.LeftEdge        =0;
  183.         eggad->Image1.TopEdge            =0;
  184.         eggad->Image1.Width                =ng->ng_Width;
  185.         eggad->Image1.Height            =ng->ng_Height;
  186.         eggad->Image1.Depth                =imagedepth;
  187.         eggad->Image1.PlanePick        =planemask;
  188.         eggad->Image1.PlaneOnOff    =0;
  189.         eggad->Image1.NextImage        =NULL;
  190.         eggad->Image1.ImageData        =(UWORD *)data;
  191.         eggad->Image2                            =eggad->Image1;
  192.         eggad->Image2.ImageData        =(UWORD *)(data+imagesize/2);
  193.  
  194.         InitBitMap(&eggad->BitMap, depth, ng->ng_Width, ng->ng_Height);
  195.         InitRastPort(&rp);
  196.         rp.BitMap=&eggad->BitMap;
  197.  
  198.         {
  199.             register int i;
  200.             register ULONG off=imagesize/depth/2;
  201.             register UBYTE *pl=(UBYTE *)eggad->Image1.ImageData;
  202.  
  203.             for(i=0; i<depth; i++, pl+=off)
  204.                 eggad->BitMap.Planes[i]=pl;
  205.         }
  206.  
  207.         SetRast(&rp, dri->dri_Pens[BACKGROUNDPEN]);
  208.         DrawBevelBox(&rp,
  209.                                     0, 0, ng->ng_Width, ng->ng_Height,
  210.                                     GT_VisualInfo, ng->ng_VisualInfo,
  211.                                     TAG_DONE);
  212.         BltBitMap(&eggad->ImageBitMap, 0, 0, &eggad->BitMap, x, y, imagewidth, imageheight, ABC|ABNC|ANBC, dri->dri_Pens[TEXTPEN],NULL);
  213.  
  214.         {
  215.             register int i;
  216.             register ULONG off=imagesize/depth/2;
  217.             register UBYTE *pl=(UBYTE *)eggad->Image2.ImageData;
  218.  
  219.             for(i=0; i<depth; i++, pl+=off)
  220.                 eggad->BitMap.Planes[i]=pl;
  221.         }
  222.  
  223.  
  224.  
  225.  
  226.         SetRast(&rp, dri->dri_Pens[FILLPEN]);
  227.         DrawBevelBox(&rp, 0, 0, ng->ng_Width, ng->ng_Height,
  228.                                     GT_VisualInfo,    ng->ng_VisualInfo,
  229.                                     GTBB_Recessed,    FALSE,
  230.                                     TAG_DONE);
  231.         BltBitMap(&eggad->ImageBitMap, 0,0, &eggad->BitMap, x, y, imagewidth, imageheight, ANBC, planemask, NULL);
  232.         BltBitMap(&eggad->ImageBitMap, 0,0, &eggad->BitMap, x, y, imagewidth, imageheight, ABC|ABNC|ANBC,    dri->dri_Pens[FILLTEXTPEN], NULL);
  233.     }
  234. }
  235.  
  236. __asm __saveds void egFreeGList(register __a0 struct egTask *task)
  237. {
  238.     register struct egGadget *gad=task->eglist;
  239.  
  240. #ifdef MYDEBUG_H
  241.     DebugOut("egFreeGList");
  242. #endif
  243.  
  244.     RemoveGList(task->window, task->glist, -1);
  245.     FreeGadgets(task->glist);
  246.     task->glist=NULL;
  247.  
  248.     while(gad)
  249.     {
  250.         register struct egGadget *egGad=gad;
  251.  
  252.         if(egGad->imageext)
  253.         {
  254.             FreeVec(egGad->imageext->Image1.ImageData);
  255.             FreeVec(egGad->imageext);
  256.         }
  257.         if(egGad->kind==EG_GROUP_KIND)
  258.             DisposeObject((Object *)egGad->gadget);
  259.  
  260.         gad=egGad->NextGadget;
  261.         FreeVec(egGad);
  262.     }
  263.     task->eglist=NULL;
  264. }
  265.  
  266. __asm __saveds void egRenderGadgets(register __a0 struct egTask *task)
  267. {
  268. #ifdef MYDEBUG_H
  269.     DebugOut("egRenderGadgets");
  270. #endif
  271.     if(task->oldWidth!=task->window->Width || task->oldHeight!=task->window->Height)
  272.     {
  273.         EraseRect(task->window->RPort,
  274.                             task->window->BorderLeft,
  275.                             task->window->BorderTop,
  276.                             MIN(task->window->Width,  task->oldWidth)    -task->window->BorderRight-1,
  277.                             MIN(task->window->Height, task->oldHeight)-task->window->BorderBottom-1);
  278.  
  279.         task->oldWidth    =task->window->Width;
  280.         task->oldHeight    =task->window->Height;
  281.     }
  282.     AddGList(task->window, task->glist, -1, -1, NULL);
  283.     RefreshGList(task->glist, task->window, NULL, -1);
  284.     GT_RefreshWindow(task->window, NULL);
  285.     if(task->lock && ISBITSET(task->flags, TASK_GHOSTWHENBLOCKED))
  286.         egGhostRect(task->window->RPort,
  287.                                 task->window->BorderLeft,    task->window->BorderTop,
  288.                                 task->window->Width-task->window->BorderRight-1,
  289.                                 task->window->Height-task->window->BorderBottom-1,
  290.                                 1);
  291.  
  292.     task->coords.LeftEdge    =task->window->LeftEdge;
  293.     task->coords.TopEdge    =task->window->TopEdge;
  294.     task->coords.Width        =task->window->Width;
  295.     task->coords.Height        =task->window->Height;
  296. }
  297.  
  298. __asm __saveds struct egGadget *egCreateGadgetA(register __a1 struct EasyGadgets *eg,
  299.                                                                                                 register __a0 struct TagItem *taglist)
  300. {
  301.     struct egGadget    *newgad,
  302.                                     *tmpgad;
  303.     UWORD *genericImage;
  304.     BYTE imageDepth=1;
  305.     WORD    genericImageWidth, genericImageHeight;
  306.  
  307. #ifdef MYDEBUG_H
  308.     DebugOut("egCreateGadgetA");
  309. #endif
  310.  
  311.     if(newgad=(struct egGadget *)AllocVec(sizeof(struct egGadget), MEMF_CLEAR|MEMF_PUBLIC))
  312.     {
  313.         struct TagItem    *tstate;
  314.         register struct TagItem    *tag;
  315.  
  316.         newgad->active=EG_LISTVIEW_NONE;
  317.         tstate=taglist;
  318.         while(tag=NextTagItem(&tstate))
  319.             switch(tag->ti_Tag)
  320.             {
  321.                 case EG_GadgetKind:
  322.                     eg->GadgetKind=tag->ti_Data;
  323.                     break;
  324.                 case EG_TextAttr:
  325.                     eg->ng.ng_TextAttr=(struct TextAttr *)tag->ti_Data;
  326.                     break;
  327.                 case EG_VisualInfo:
  328.                     eg->ng.ng_VisualInfo=(void *)tag->ti_Data;
  329.                     break;
  330.                 case EG_LeftEdge:
  331.                     eg->ng.ng_LeftEdge=(WORD)tag->ti_Data;
  332.                     break;
  333.                 case EG_TopEdge:
  334.                     eg->ng.ng_TopEdge=(WORD)tag->ti_Data;
  335.                     break;
  336.                 case EG_Width:
  337.                     eg->ng.ng_Width=(WORD)tag->ti_Data;
  338.                     break;
  339.                 case EG_Height:
  340.                     eg->ng.ng_Height=(WORD)tag->ti_Data;
  341.                     break;
  342.                 case EG_GadgetText:
  343.                     eg->ng.ng_GadgetText=(char *)tag->ti_Data;
  344.                     break;
  345.                 case EG_GadgetID:
  346.                     eg->ng.ng_GadgetID=(UWORD)tag->ti_Data;
  347.                     break;
  348.                 case EG_Flags:
  349.                     eg->ng.ng_Flags=tag->ti_Data;
  350.                     break;
  351.                 case EG_ParentGadget:
  352.                     eg->gad=(struct Gadget *)tag->ti_Data;
  353.                     break;
  354.                 case EG_Window:
  355.                     eg->Window=(struct Window *)tag->ti_Data;
  356.                     break;
  357.                 case GA_Disabled:
  358.                     IFTRUESETBIT(tag->ti_Data, newgad->flags, EG_DISABLED);
  359.                     break;
  360.                 case EG_PlaceLeft:
  361.                     tmpgad=(struct egGadget *)tag->ti_Data;
  362.                     eg->ng.ng_LeftEdge=X1(tmpgad)-eg->HSpace-eg->ng.ng_Width;
  363.                     break;
  364.                 case EG_PlaceRight:
  365.                     tmpgad=(struct egGadget *)tag->ti_Data;
  366.                     eg->ng.ng_LeftEdge=X2(tmpgad)+eg->HSpace;
  367.                     break;
  368.                 case EG_PlaceBelow:
  369.                     tmpgad=(struct egGadget *)tag->ti_Data;
  370.                     switch(tmpgad->kind)
  371.                     {
  372.                         case MX_KIND:
  373.                             {
  374.                                 register UWORD i=0, height=MAX(eg->MXHeight, tmpgad->ng.ng_TextAttr->ta_YSize);
  375.  
  376.                                 while(tmpgad->labels[i])
  377.                                     ++i;
  378.                                 eg->ng.ng_TopEdge=Y1(tmpgad)+i*height+(i-1)*eg->VSpace+eg->VSpace;
  379.                             }
  380.                             break;
  381.                         default:
  382.                             eg->ng.ng_TopEdge=Y2(tmpgad)+eg->VSpace;
  383.                             break;
  384.                     }
  385.                     break;
  386.                 case EG_PlaceOver:
  387.                     tmpgad=(struct egGadget *)tag->ti_Data;
  388.                     eg->ng.ng_TopEdge=Y1(tmpgad)-eg->VSpace-eg->ng.ng_Height;
  389.                     break;
  390.                 case EG_AlignLeft:
  391.                     tmpgad=(struct egGadget *)tag->ti_Data;
  392.                     eg->ng.ng_LeftEdge=X1(tmpgad);
  393.                     break;
  394.                 case EG_AlignTop:
  395.                     tmpgad=(struct egGadget *)tag->ti_Data;
  396.                     eg->ng.ng_TopEdge=Y1(tmpgad);
  397.                     break;
  398.                 case EG_AlignRight:
  399.                     tmpgad=(struct egGadget *)tag->ti_Data;
  400.                     eg->ng.ng_LeftEdge=X2(tmpgad)-eg->ng.ng_Width;
  401.                     break;
  402.                 case EG_AlignBottom:
  403.                     tmpgad=(struct egGadget *)tag->ti_Data;
  404.                     eg->ng.ng_TopEdge=Y2(tmpgad)-eg->ng.ng_Height;
  405.                     break;
  406.                 case EG_AlignCentreH:
  407. //                    tmpgad=(struct egGadget *)tag->ti_Data;
  408.                     break;
  409.                 case EG_AlignCentreV:
  410. //                    tmpgad=(struct egGadget *)tag->ti_Data;
  411.                     break;
  412.                 case EG_CloneWidth:
  413.                     tmpgad=(struct egGadget *)tag->ti_Data;
  414.                     eg->ng.ng_Width=W(tmpgad);
  415.                     break;
  416.                 case EG_CloneHeight:
  417.                     tmpgad=(struct egGadget *)tag->ti_Data;
  418.                     eg->ng.ng_Height=H(tmpgad);
  419.                     break;
  420.                 case EG_CloneSize:
  421.                     tmpgad=(struct egGadget *)tag->ti_Data;
  422.                     eg->ng.ng_Height=H(tmpgad);
  423.                     eg->ng.ng_Width=W(tmpgad);
  424.                     break;
  425.                 case EG_PlaceWindowLeft:
  426.                     eg->ng.ng_LeftEdge=eg->LeftMargin;
  427.                     if(ISBITSET(eg->ng.ng_Flags, PLACETEXT_LEFT) && eg->ng.ng_GadgetText)
  428.                         eg->ng.ng_LeftEdge+=EG_LabelSpace+egTextWidth(eg, eg->ng.ng_GadgetText);
  429.                     break;
  430.                 case EG_PlaceWindowRight:
  431.                     eg->ng.ng_LeftEdge=eg->Window->Width-eg->RightMargin-eg->ng.ng_Width;
  432.                     if(ISBITSET(eg->ng.ng_Flags, PLACETEXT_RIGHT))
  433.                         if(eg->ng.ng_GadgetText)
  434.                             eg->ng.ng_LeftEdge-=EG_LabelSpace+egTextWidth(eg, eg->ng.ng_GadgetText);
  435.                     break;
  436.                 case EG_PlaceWindowTop:
  437.                     eg->ng.ng_TopEdge=eg->TopMargin;
  438.                     if(ISBITSET(eg->ng.ng_Flags, PLACETEXT_ABOVE) && eg->ng.ng_GadgetText)
  439.                         eg->ng.ng_TopEdge+=4+eg->font->tf_YSize;
  440.                     break;
  441.                 case EG_PlaceWindowBottom:
  442.                     eg->ng.ng_TopEdge=eg->Window->Height-eg->ng.ng_Height;
  443.                     if(ISBITSET(eg->Window->Flags, WFLG_SIZEBBOTTOM))
  444.                         eg->ng.ng_TopEdge-=eg->BottomMargin;
  445.                     else
  446.                         eg->ng.ng_TopEdge-=eg->BottomMarginNoSize;
  447.  
  448.                     if(ISBITSET(eg->ng.ng_Flags, PLACETEXT_BELOW) && eg->ng.ng_GadgetText)
  449.                         eg->ng.ng_TopEdge-=4-eg->font->tf_YSize;
  450.                     break;
  451.                 case EG_HSpace:
  452.                     eg->ng.ng_LeftEdge+=(WORD)tag->ti_Data;
  453.                     break;
  454.                 case EG_VSpace:
  455.                     eg->ng.ng_TopEdge+=(WORD)tag->ti_Data;
  456.                     break;
  457.                 case GTCY_Labels:
  458.                 case GTMX_Labels:
  459.                     newgad->labels=(STRPTR *)tag->ti_Data;
  460.                     break;
  461.                 case GTLV_Labels:
  462.                     newgad->list=(struct List *)tag->ti_Data;
  463.                     newgad->max=MAX(0, (egCountList(newgad->list)-1));
  464.                     break;
  465.                 case GTLV_ReadOnly:
  466.                     SETBIT(newgad->flags, EG_READONLY);
  467.                     break;
  468.                 case GTCY_Active:
  469.                 case GTMX_Active:
  470.                 case GTCB_Checked:
  471.                 case GTLV_Selected:
  472.                 case GTSL_Level:
  473.                     newgad->active=(LONG)tag->ti_Data;
  474.                     break;
  475.                 case GTSL_Min:
  476.                     newgad->min=(WORD)tag->ti_Data;
  477.                     break;
  478.                 case GTSL_Max:
  479.                     newgad->max=(WORD)tag->ti_Data;
  480.                     break;
  481.                 case GTPA_Depth:
  482.                     newgad->max=(WORD)1<<tag->ti_Data;
  483.                     break;
  484.                 case EG_HelpNode:
  485.                     newgad->helpnode=(UBYTE *)tag->ti_Data;
  486.                     break;
  487.                 case EG_VanillaKey:
  488.                     newgad->key=(UBYTE)tag->ti_Data;
  489.                     break;
  490.                 case EG_Link:
  491.                     newgad->link=(struct egGadget *)tag->ti_Data;
  492.                     break;
  493.                 case EG_Arrows:
  494.                     IFTRUESETBIT(tag->ti_Data, newgad->flags, EG_LISTVIEWARROWS);
  495.                     break;
  496.                 case EG_DefaultWidth:
  497.                     switch(eg->GadgetKind)
  498.                     {
  499.                         case SLIDER_KIND:
  500.                         case SCROLLER_KIND:
  501.                             eg->ng.ng_Width=eg->SliderWidth;
  502.                             break;
  503.                         case MX_KIND:
  504.                             eg->ng.ng_Width=eg->MXWidth;
  505.                             break;
  506.                         case CHECKBOX_KIND:
  507.                             eg->ng.ng_Width=eg->CheckboxWidth;
  508.                             break;
  509.                         case EG_GETFILE_KIND:
  510.                             eg->ng.ng_Width=EG_GetfileWidth;
  511.                             break;
  512.                         case EG_POPUP_KIND:
  513.                             eg->ng.ng_Width=EG_PopupWidth;
  514.                             break;
  515.                         case EG_GETDIR_KIND:
  516.                             eg->ng.ng_Width=EG_GetdirWidth;
  517.                             break;
  518.                         default:
  519. //                            eg->ng.ng_Width=egTextWidth(eg->RPort, eg->ng.ng_GadgetText)+eg->HInside;
  520.                             eg->ng.ng_Width=egTextWidth(eg, eg->ng.ng_GadgetText)+eg->HInside;
  521.                             break;
  522.                     }
  523.                     break;
  524.                 case EG_DefaultHeight:
  525.                     switch(eg->GadgetKind)
  526.                     {
  527.                         case SLIDER_KIND:
  528.                         case SCROLLER_KIND:
  529.                             eg->ng.ng_Height=eg->SliderHeight;
  530.                             break;
  531.                         case MX_KIND:
  532.                             eg->ng.ng_Height=eg->MXHeight;
  533.                             break;
  534.                         case CHECKBOX_KIND:
  535.                             eg->ng.ng_Height=eg->CheckboxHeight;
  536.                             break;
  537.                         default:
  538.                             eg->ng.ng_Height=eg->DefaultHeight;
  539.                             break;
  540.                     }
  541.                     break;
  542.  
  543.                 case EG_Image:
  544.                     genericImage=(UWORD *)tag->ti_Data;
  545.                     break;
  546.                 case EG_ImageWidth:
  547.                     genericImageWidth=(WORD)tag->ti_Data;
  548.                     break;
  549.                 case EG_ImageHeight:
  550.                     genericImageHeight=(WORD)tag->ti_Data;
  551.                     break;
  552.                 case EG_ImageDepth:
  553.                     imageDepth=(BYTE)tag->ti_Data;
  554.                     break;
  555.         }
  556.  
  557.         newgad->kind=eg->GadgetKind;
  558.  
  559.         switch(eg->GadgetKind)
  560.         {
  561.             case EG_GROUP_KIND:
  562.                 eg->gad=NewObject(eg->groupframeclass, NULL,
  563.                                                     GA_Left,            eg->ng.ng_LeftEdge,
  564.                                                     GA_Top,                eg->ng.ng_TopEdge,
  565.                                                     GA_Width,            eg->ng.ng_Width,
  566.                                                     GA_Height,        eg->ng.ng_Height,
  567.                                                     GA_Previous,    eg->gad,
  568.                                                     TAG_MORE,            taglist,
  569.                                                     TAG_DONE);
  570.                 break;
  571.             default:
  572.                 eg->gad=CreateGadget((newgad->kind>=EG_GETFILE_KIND ? GENERIC_KIND : newgad->kind),
  573.                                                         eg->gad,
  574.                                                         &eg->ng,
  575.                                                         GT_Underscore,        EG_Underscorechar,
  576.                                                         GTCB_Scaled,            TRUE,
  577.                                                         GTMX_Scaled,            TRUE,
  578.                                                         GTMX_Spacing,            eg->VSpace,
  579.                                                         STRINGA_ExitHelp,    TRUE,
  580.                                                         TAG_MORE,                    taglist,
  581.                                                         TAG_END);
  582.                 break;
  583.         }
  584.         if(eg->gad)
  585.         {
  586.             newgad->ng=eg->ng;
  587.             newgad->gadget=eg->gad;
  588.             if(newgad->ng.ng_GadgetText && newgad->kind!=TEXT_KIND)
  589.                 newgad->key=egFindVanillaKey(newgad->ng.ng_GadgetText);
  590.  
  591.             if(newgad->helpnode==NULL)
  592.                 newgad->helpnode=eg->lasthelpnode;
  593.             eg->lasthelpnode=newgad->helpnode;
  594.  
  595.             if(eg->eggad==NULL)
  596.                 eg->tmptask->eglist=newgad;
  597.             else
  598.                 eg->eggad->NextGadget=newgad;
  599.             eg->eggad=newgad;
  600.  
  601.             switch(newgad->kind)
  602.             {
  603.                 case LISTVIEW_KIND:
  604.                 case MX_KIND:
  605.                     newgad->ng.ng_Height=eg->gad->Height;
  606.                     newgad->ng.ng_Width    =eg->gad->Width;
  607.                     break;
  608.                 case CHECKBOX_KIND:    
  609.                     newgad->ng.ng_Width    =eg->gad->Width;
  610.                     break;
  611.             }
  612.  
  613.             if(newgad->kind>=EG_GETFILE_KIND)
  614.             {
  615.                 switch(newgad->kind)
  616.                 {
  617.                     case EG_DUMMY_KIND:
  618.                         newgad->gadget->GadgetType     |=GTYP_BOOLGADGET;
  619.                         newgad->gadget->Flags                    =GFLG_GADGHIMAGE|GFLG_GADGIMAGE;
  620.                         newgad->gadget->Activation        =0;
  621.                         newgad->gadget->GadgetRender    =NULL;
  622.                         newgad->gadget->SelectRender    =NULL;
  623.                         break;
  624.                     default:
  625.                         if(newgad->imageext=(struct egImageExt *)AllocVec(sizeof(struct egImageExt), MEMF_CLEAR|MEMF_PUBLIC))
  626.                         {
  627.                             switch(newgad->kind)
  628.                             {
  629.                                 case EG_GETFILE_KIND:        
  630.                                     egCalcGadgetImage(newgad->imageext, eg->dri, &eg->ng, EG_GetFileImageData, 9, 10,1);
  631.                                     break;
  632.                                 case EG_GETDIR_KIND:        
  633.                                     egCalcGadgetImage(newgad->imageext, eg->dri, &eg->ng, EG_GetDirImageData, 12, 10,1);
  634.                                     break;
  635.                                 case EG_POPUP_KIND:        
  636.                                     egCalcGadgetImage(newgad->imageext, eg->dri, &eg->ng, EG_PopUpImageData, 7, 9,1);
  637.                                     break;
  638.                                 case EG_IMAGE_KIND:
  639.                                     egCalcGadgetImage(newgad->imageext, eg->dri, &eg->ng,
  640.                                         genericImage, genericImageWidth, genericImageHeight, imageDepth);
  641.                                     break;
  642.                             }
  643.                             eg->gad->GadgetType     |=GTYP_BOOLGADGET;
  644.                             eg->gad->Flags                =GFLG_GADGHIMAGE|GFLG_GADGIMAGE;
  645.                             eg->gad->Activation        =GACT_RELVERIFY;
  646.                             eg->gad->GadgetRender    =&newgad->imageext->Image1;
  647.                             eg->gad->SelectRender    =&newgad->imageext->Image2;
  648.                         }
  649.                         break;
  650.                 }
  651.                 if(ISBITSET(newgad->flags, EG_DISABLED))
  652.                     OffGadget(eg->gad, eg->Window, NULL);
  653.             }
  654.             return newgad;
  655.         }
  656.     }
  657.     return NULL;
  658. }
  659.  
  660. __asm __saveds void egCreateContext(register __a0 struct EasyGadgets    *eg,
  661.                                                                         register __a1 struct egTask                *task)
  662. {
  663. #ifdef MYDEBUG_H
  664.     DebugOut("egCreateContext");
  665. #endif
  666.     task->glist            =NULL;
  667.     eg->gad                    =CreateContext(&task->glist);
  668.     task->activegad    =task->eglist=NULL;
  669.     eg->tmptask            =task;
  670.     eg->eggad                =NULL;
  671.     task->activekey    =0;
  672.     eg->dri                    =task->dri;
  673.     eg->ng.ng_VisualInfo    =task->VisualInfo;
  674. }
  675.  
  676. __asm BYTE IsNil(register __a0 struct List *list)
  677. {
  678.     if(list==NULL)
  679.         return 1;
  680.     return (BYTE)(IsListEmpty(list));
  681. }
  682.  
  683. #endif
  684.